/*
		结构体

		夏思成

		2024年4月8日

		西科大15号公寓楼
*/

//#include <stdio.h>
//
////定义了一个学生类型
//struct student
//{
//	char name[15];//学生姓名
//	char sex[5];//性别
//	int age;//年龄
//};
//
//int main()
//{
//	//在创建变量的同时进行初始化
//	//该初始化必须得按照结构体内部成员的顺序进行初始化
//	struct student stu1 = { "zhangsan","nan",18 };
//
//	printf("%s\n", stu1.name);
//	printf("%s\n", stu1.sex);
//	printf("%d\n", stu1.age);
//
//	//利用访问操作符可实现自定义顺序进行初始化
//	struct student stu2 = { .age = 21,.name = "lisi",.sex = "nv" };
//
//	printf("%s\n", stu2.name);
//	printf("%s\n", stu2.sex);
//	printf("%d\n", stu2.age);
//
//	return 0;
//}


//声明结构体的时候直接创建变量
//#include <stdio.h>
//
//struct student
//{
//	char name[15];
//	char sex[5];
//	int age;
//}stu1;
//
//int main()
//{
//	struct student stu2 = { 0 };
//
//	return 0;
//}


////匿名结构体
//
//#include <stdio.h>
//
////匿名结构体，该结构体没有标识符
//struct
//{
//	char name[15];
//	char sex[5];
//	int age;
//}stu;
//
//int main()
//{
//
//	return 0;
//}



//#include <stdio.h>
//
//
//struct
//{
//	int a;
//	char b;
//	float c;
//}x;
//
//struct
//{
//	int a;
//	char b;
//	float c;
//}*p;
//
//int main()
//{
//	p = &x;
//	return 0;
//}


////结构体的自引用
//
//#include <stdio.h>
//
////struct stu
////{
////	int age;
////	struct stu s;
////};
//
//
//
//struct stu
//{
//	int age;
//	struct stu *s;
//};
//
//int main()
//{
//	return 0;
//}

//
//
////利用typedef关键字对结构体进行重命名
//
//#include <stdio.h>
//
//typedef struct student
//{
//	char name[14];
//	int age;
//}stu;
//
//int main()
//{
//	stu s;
//	struct student s2;
//	return 0;
//}



////利用typedef关键字解决匿名结构体的问题
//
//#include <stdio.h>
//
//typedef struct
//{
//	char a;
//	int b;
//}X;
//
//int main()
//{
//	X x;
//	X s;
//	return 0;
//}


//
//struct S1
//{
//	char c1;
//	int i;
//	char c2;
//};
//
//
//
//struct S2
//{
//	char c1;
//	char c2;
//	int i;
//};
//
//
//
//#include <stdio.h>
//
//struct S3
//{
//	double d;
//	char c;
//	int i;
//};
//
//struct S4
//{
//	char c1;
//	struct S3 s3;
//	double d;
//};
//
//int main()
//{
//	printf("%zd\n", sizeof(struct S4));
//	return 0;
//}


//#include <stdio.h>
//
//struct S1
//{
//	char c1;
//	int i;
//	char c2;
//};
//
//struct S2
//{
//	char c1;
//	char c2;
//	int i;
//};
//
//int main()
//{
//	printf("%zd\n", sizeof(struct S1));
//	printf("%zd\n", sizeof(struct S2));
//	return 0;
//}


////利用#pragma修改默认对齐数
//
//#include <stdio.h>
//#pragma pack(1)//设置默认对⻬数为1 
//struct S
//{
//	char c1;
//	int i;
//	char c2;
//};
//#pragma pack()//取消设置的对⻬数，还原为默认 
//
//int main()
//{
//	//输出的结果是什么？ 
//	printf("%zd\n", sizeof(struct S));
//	return 0;
//}


//
////结构体传参
//
//#include <stdio.h>
//
//struct S
//{
//	char c1;
//	char c2;
//	int i;
//};
//
////值传递
//void test1(struct S s)
//{
//	printf("%c\n", s.c1);
//	printf("%c\n", s.c2);
//	printf("%d\n", s.i);
//}
//
////地址传递
//void test2(struct S* ps)
//{
//	printf("%c\n", ps->c1);
//	printf("%c\n", ps->c2);
//	printf("%d\n", ps->i);
//}
//
//int main()
//{
//	struct S s = { 'a','b',10 };
//	test1(s);
//	test2(&s);
//	return 0;
//}
//
//
//void test()
//{
//	int n = 1;
//	return *((char*)&n);
//}

//
////结构体实现位段
//#include <stdio.h>
//
//struct S
//{
//	int _a : 2;
//	int _b : 5;
//	int _c : 10;
//	int _d : 15;
//	int _e : 30;
//};
//
//int main()
//{
//	printf("%zd\n", sizeof(struct S));
//	return 0;
//}





////模拟实现strncpy
//#include<stdio.h>
//#include<assert.h>
//#include <string.h>
//char* my_strnpy(char* dest, char* sou, int num)
//{
//	assert(dest);
//	assert(sou);
//	/*char* tmp = dest;
//	while ((*dest++ = *sou++) && num && (*sou != '\0'))
//	{
//		num--;
//	}
//	while ((*sou == '\0') && num)
//	{
//		*dest = '\0';
//		num--;
//	}*/
//
//	int i = 0;
//	for (i = 0; sou[i] != '\0' && i < num; i++)
//	{
//		dest[i] = sou[i];
//	}
//
//	if (i < num)
//	{
//		dest[i] = '\0';
//	}
//
//	return dest;
//}
//int main()
//{
//	char arr1[20] = "**************";
//	char arr2[] = "abcd";
//	//int sz1 = sizeof(arr1) / sizeof(arr1[0]);
//	//int sz2 = sizeof(arr2) / sizeof(arr2[0]);
//	//char* ret = my_strnpy(arr1, arr2, 6);
//	char* ret = strncpy(arr1, arr2, 6);
//	printf("%s\n", ret);
//
//	return 0;
//}



/*#include<stdio.h>
#include<assert.h>
char* my_strnpy(char* dest, char* sour, int num)
{
	assert(dest);
	assert(sour);
	char* tmp = dest;
	while (*dest++ = *sour++ && num--)
	{
		;
	}

	while ((*sour == '\0') && num)
	{
		*dest++ = '\0';
		num--;
	}
	return tmp;
}
int main()
{
	char arr1[20] = "**************";
	char arr2[] = "abcd";
	int sz1 = sizeof(arr1) / sizeof(arr1[0]);
	int sz2 = sizeof(arr2) / sizeof(arr2[0]);
	char* ret = my_strnpy(arr1, arr2, 6);
	printf("%s\n", ret);

	return 0;
}*/


//
//#include<stdio.h>
//#include<assert.h>
//char* my_strnpy(char* dest, char* sour, int num)
//{
//	assert(dest);
//	assert(sour);
//	char* tmp = dest;
//	while ((*dest++ = *sour++) && --num)
//	{
//		;
//	}
//	/*while ((*sour == '\0') && --num)
//	{
//		*dest++ = '\0';
//
//	}*/
//	return tmp;
//}
//
//int main()
//{
//	char arr1[20] = "**************";
//	char arr2[] = "abcd";
//	//int sz1 = sizeof(arr1) / sizeof(arr1[0]);
//	//int sz2 = sizeof(arr2) / sizeof(arr2[0]);
//	printf("%s\n", my_strnpy(arr1, arr2, 6));
//	return 0;
//}



//#include <stdio.h>
//
//struct A
//{
//	int a;
//	int b;
//	int c;
//};
//
//struct B
//{
//	int _a : 2;
//	int _b : 5;
//	int _c : 10;
//};



//struct A
//{
//	char _a : 2;
//	char _b : 3;
//	char _c : 5;
//	char _d : 8;
//};
//int main()
//{
//	struct A s = { 0 };
//	s._a = 10;
//	s._b = 2;
//	s._c = 12;
//	s._d = 5;
//
//	printf("%zd\n", sizeof(struct A));
//	return 0;
//}

//
//#include <stdio.h>
//struct A
//{
//	int _a : 2;
//	int _b : 5;
//	int _c : 10;
//	int _d : 30;
//};
//int main()
//{
//	struct A sa = { 0 };
//	scanf("%d", &sa._b);//这是错误的 
//
//	//正确的⽰范 
//	int b = 0;
//	scanf("%d", &b);
//	sa._b = b;
//	return 0;
//}



#include <stdio.h>
int main()
{
	printf("hello world");
	return 0;
}